package com.adee.java;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.TimeUnit;

/**
 * ForkJoinPool.commonPool()是jvm中全局共享的线程池，最大线程数为cpu核数-1，比如我的电脑cpu为8核，
 * 则最大线程数为7。开始时线程数为0，当调用forkJoinPool.submit(...)或execute(...)方法提交任务时会创建线程。
 *
 * 线程名为：ForkJoinPool.commonPool-worker-1、ForkJoinPool.commonPool-worker-2等等。
 *
 * 也可以 new ForkJoinPool() 手动创建线程池，但要注意使用完后手动关闭。
 *
 */
public class Test022_4_ForkJoinPool_commonPool {
    public static void main(String[] args) throws InterruptedException {
//        test1();
        test2();
    }

    // 共享线程池commonPool测试，线程名：ForkJoinPool.commonPool-worker-1，最大线程数：cpu核数-1
    public static void test1() throws InterruptedException {
        ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();
        for (int i = 0; i < 10; i++) {

            ForkJoinTask<String> task = forkJoinPool.submit(() -> {
                TimeUnit.MINUTES.sleep(10);
                return "hello";
            });
        }

//        String result = task.get();
        TimeUnit.MINUTES.sleep(20);
    }

    // 手动new创建线程池测试，线程名：ForkJoinPool-1-worker-0，默认最大线程数也是：cpu核数
    public static void test2() throws InterruptedException {
        ForkJoinPool pool = new ForkJoinPool();
        for (int i = 0; i < 10; i++) {

            ForkJoinTask<String> task = pool.submit(() -> {
                TimeUnit.MINUTES.sleep(10);
                return "hello";
            });
        }

        // 手动关闭
        pool.shutdown();

        TimeUnit.MINUTES.sleep(20);
    }
}
